/******************************************************************************/
/* Fichero:     Usuario.java
/* Versión:     1.0
/* Autor:       Luis Maqueda
/* Fecha:       Mayo 2009
/* Proyecto:    AELANsoft cumpleaños
/* Descripción: Clase que representa al operador que está registrado y se
encuentra utilizando la aplicación.
/******************************************************************************/
package utiles;

import rmi.Cliente;

/******************************************************************************/
public class Usuario {
/******************************************************************************/

   private String correo;
   private Cliente cliente;
   private Amigos amigos;
   private Busqueda busqueda;

   /***************************************************************************
    * Constructor de clase. Asigna al nuevo objecto los atributos correo y
    * cliente.
    * Pre: correo debe ser una direccion de correo electronico valida
    * @param correo Direccion de correo electronico del usuario
    * @param c Cliente correspondiente al usuario
    **************************************************************************/
   public Usuario(String correo, Cliente c) {
      this.correo = correo;
      this.cliente = c;
   }

   /***************************************************************************
    * Crea el objeto Amigos. El objeto Amigos corresponde con el vector de
    * amigos que posee la lista de todos los amigos del usuario obtenidos con
    * el método ListaAmigos() del cliente. En caso de error devuelve el código
    * de error correspondiente.
    * @return codigo de error. En caso de exito devuelve 0.
    **************************************************************************/
   public int AmigosUsuario() {
      // Variables
      VectorPersonas vectorAmigos = new VectorPersonas();
      int estado;

      estado = cliente.ListarAmigos(correo, vectorAmigos);
      if (estado == 0) {
         // creación del objeto de tipo Amigos.
         this.amigos = new Amigos(vectorAmigos);
      }
      return estado;
   }

   /***************************************************************************
    * Pre: existe un vectorPersonas no nulo resultado de una búsqueda.
    * Post: Se añadirá como nuevo amigo del usuario a aquella persona que ocupa
    * la posición indiceAmigo en el VectorPersonas. Para introducir este nuevo
    * amigo se invocará al método AñadirAmigo() del Cliente. Si se ha añadido
    * correctamente el nuevo amigo, este será eliminado del vector de búsquedas
    * invocando al método EliminarUnResultado(indiceAmigo) de la clase
    * búsqueda. Además se ha de actualizar la lista de amigos del usuario
    * invocando al método ActualizarAmigos() del Amigos. En caso de error
    * devuelve el código de error correspondiente.
    * @param indiceAmigo indice del amigo a añadir
    * @return estado codigo de error, en caso de exito devuelve 0.
    **************************************************************************/
   public int AnadirAmigo(int indiceAmigo) {

      String correoA = busqueda.ObtenerCorreo(indiceAmigo);
      int estado = cliente.AnadirAmigo(this.correo, correoA);

      if (estado == 0) {
         // todo ha ido ok
         Persona persona = busqueda.EliminaUnResultado(indiceAmigo);
         amigos.ActualizarAmigos(persona);
      }
      return estado;
   }

   /***************************************************************************
    * Pre: Se ha invocado al método RealizarBusqueda() del Cliente.
    * Post: Una vez realizada la búsqueda en la base de datos, se crea una
    * instancia de la clase búsqueda para almacenar y manejar dicha búsqueda.
    * @param resultadosBusqueda indice del amigo a añadir
    **************************************************************************/
   public void RealizarBusqueda(VectorPersonas resultadosBusqueda) {
      this.busqueda = new Busqueda(resultadosBusqueda);
   }

   /***************************************************************************
    * Devuelve una referencia a la variable correo
    * @return correo referencia a la variable correo
    **************************************************************************/
   public String GetCorreo() {
      return this.correo;
   }

   /***************************************************************************
    * Devuelve una referencia a la variable cliente
    * @return cliente referencia a la variable cliente
    **************************************************************************/
   public Cliente GetCliente() {
      return this.cliente;
   }

   /***************************************************************************
    * Devuelve una referencia a la variable amigos
    * @return amigos referencia a la variable amigos
    **************************************************************************/
   public Amigos GetAmigos() {
      return this.amigos;
   }

   /***************************************************************************
    * Devuelve una referencia a la variable busqueda
    * @return amigos referencia a la variable busqueda
    **************************************************************************/
   public Busqueda GetBusqueda() {
      return this.busqueda;
   }

}
